#ifndef __HOTPLUG_H_
#define __HOTPLUG_H_



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <sys/mount.h>
#include <map>
#include <string.h>
#include "log.h"
#include <sys/prctl.h>

using namespace std;
#define EPOLL_FD_SIZE     3      //需要监听的fd个数
#define EPOLL_EVENT_SIZE  3
#define EPOLL_TIMEOUT     1000  //等待的超时时间，1000ms 也就是1秒

#ifndef KERNEL_UEVENT_LEN
#define KERNEL_UEVENT_LEN      (4*1024)
#endif
typedef enum eHotplugStatus_t
{  
    HOTPLUG_ADD = 1,
    HOTPLUG_REMOVE = 2,
    HOTPLUG_MAX
}eHotplugStatus;
typedef void (*HotplugCb)(const char *dev_str, eHotplugStatus status, void *data);
typedef struct
{
    int epoll_fd;              //epoll 对应的fd
    int uevent_fd;             //热插拔节点的sock 句柄
    pthread_t hotplug_thread;  //对应的线程
    int is_start;              //线程是否已经创建
    int is_running;            //是否在while循环中运行
    } hotplug_context_t;
typedef struct
{
    HotplugCb cb;
    void *data;
    eHotplugStatus devstatus;
}HotplugEvent_t;


class CHotplug
{
   
  
   public:
      CHotplug();
      ~CHotplug();
      int HotplugInit();
      int HotplugUnInit();
      void HotplugRegisterEvent(const char *dev_str, HotplugCb cb, void *data);  
      void HotplugUnRegisterEvent(const char *dev_str);
      int HotplugSchedule(void *arg); //循环调用
   private:
      hotplug_context_t hotplug;
      char uevent_buff[KERNEL_UEVENT_LEN];
      map<string, HotplugEvent_t> HotplugEventList;
   private:
      int HotplugCreateUEvent();
      void HotplugDestoryUEvent();
      void HotplugPraseUEvent(char* recv_buff,int recv_size);
       

};






#endif